from functools import wraps
from datetime import datetime
from django.core.cache import cache
import json

def rate_limit_lock(default_ttl=86400):
    """
    限频执行锁装饰器（支持自定义缓存时间）
    
    :param key_template: 缓存键模板，可包含 {date} 占位符
    :param default_ttl: 默认缓存时间（秒），默认24小时（86400秒）
    """
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            # 从kwargs获取自定义TTL（秒），未传入则使用默认值
            ttl = kwargs.pop('_ttl', default_ttl)
            
            # 生成唯一键（包含日期和参数）
            today = datetime.now().strftime("%Y%m%d")
            key = f'FUNC:CACHE:{args}{kwargs}'
            
            # 检查是否已存在锁
            result = cache.get(key)
            if result:
                return json.loads(result)
            
            # 设置处理中状态
            cache.set(key, "processing", timeout=ttl)
            
            try:
                result = func(*args, **kwargs)
                # 更新为完成状态（可选）
                cache.set(key, json.dumps(result), timeout=ttl)
                return result
            except Exception as e:
                # 失败时移除锁
                cache.delete(key)
                raise
        return wrapper
    return decorator